home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / unrar-free / misc / tarar.pike
Text File  |  2007-05-15  |  6KB  |  210 lines

  1. #!/usr/bin/pike
  2. /* Copyright (C) 2004  Jeroen Dekkers <jeroen@dekkers.cx>
  3.    Copyright (C) 2004  Ben Asselstine <benasselstine@canada.com>
  4.    Copyright (C) 2006  Ying-Chun Liu <grandpaul@gmail.com>
  5.  
  6.    This program is free software; you can redistribute it and/or
  7.    modify it under the terms of the GNU General Public License
  8.    as published by the Free Software Foundation; either version 2
  9.    of the License, or (at your option) any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License along
  17.    with this program; if not, write to the Free Software Foundation, Inc.,
  18.    51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
  19.  
  20. /* test case generator 1 */
  21.  
  22. import Stdio;
  23.  
  24. int crc32_file(Stdio.File file1) {
  25.   int currentpos;
  26.   int shiftRegister=0;
  27.   string data;
  28.  
  29.   currentpos = file1->tell();
  30.  
  31.   file1->seek(0);
  32.  
  33.   while (1) {
  34.     data = file1->read(1024*8);
  35.     if (data == 0 || strlen(data)==0) {
  36.       break;
  37.     }
  38.     shiftRegister = Gz.crc32(data,shiftRegister);
  39.   }
  40.  
  41.   file1->seek(currentpos);
  42.   return shiftRegister;
  43. }
  44.  
  45. string int2bin16 (int d) {
  46.   string ret;
  47.   ret=sprintf("%c%c",
  48.           d%256,
  49.           (d/256)%256);
  50.   return ret;
  51. }
  52.  
  53. string int2bin32 (int d) {
  54.   string ret;
  55.   ret=sprintf("%c%c%c%c",
  56.           d%256,
  57.           (d/256)%256,
  58.           (d/256/256)%256,
  59.           (d/256/256/256)%256);
  60.   return ret;
  61. }
  62.  
  63. int addfile(string filename1,Stdio.File rarfile) {
  64.   Stdio.File datafile = Stdio.File();
  65.   Stdio.Stat datafile_stat;
  66.   int datafile_crc32,tmp1;
  67.   mapping(string:int) datafile_mtime;
  68.   string datafile_header;
  69.   if (datafile->open(filename1,"r")==0) {
  70.     return 0;
  71.   }
  72.   datafile_stat = datafile->stat();
  73.   datafile_mtime = localtime(datafile_stat->mtime);
  74.   datafile_crc32 = ((crc32_file(datafile)) & 0x0ffffffff);
  75.   /* header: type, flags */
  76.   datafile_header = "\x74\0\x80";
  77.   /* header: header size */
  78.   tmp1 = 32+strlen(filename1);
  79.   datafile_header = datafile_header + int2bin16(tmp1);
  80.   /* header: comp. size, uncomp. size */
  81.   tmp1 = datafile_stat->size;
  82.   datafile_header = datafile_header + int2bin32(tmp1);
  83.   datafile_header = datafile_header + int2bin32(tmp1);
  84.   /* header: OS */
  85.   datafile_header = datafile_header + "\0";
  86.   /* header: File CRC */
  87.   tmp1 = datafile_crc32;
  88.   datafile_header = datafile_header + int2bin32(tmp1);
  89.   /* header: time */
  90.   tmp1 = (datafile_mtime["year"]-80);
  91.   if (tmp1 < 0) tmp1=0;
  92.   tmp1 = tmp1 << 25;
  93.   tmp1 = tmp1 + ((datafile_mtime["mon"]+1)<<21);
  94.   tmp1 = tmp1 + ((datafile_mtime["mday"])<<16);
  95.   tmp1 = tmp1 + ((datafile_mtime["hour"])<<11);
  96.   tmp1 = tmp1 + ((datafile_mtime["min"])<<5);
  97.   tmp1 = tmp1 + ((datafile_mtime["sec"])>>1);
  98.   datafile_header = datafile_header + int2bin32(tmp1);
  99.   /* header: unp. version, method */
  100.   datafile_header = datafile_header + "\x14\x30";
  101.   /* header: filename size */
  102.   tmp1 = strlen(filename1);
  103.   datafile_header = datafile_header + int2bin16(tmp1);
  104.   /* header: file attr. */
  105.   datafile_header = datafile_header + "\x20\0\0\0";
  106.   /* header: filename */
  107.   datafile_header = datafile_header + 
  108.     replace(filename1,"/","\\");
  109.   /* header: crc32 */
  110.   tmp1 = ((Gz.crc32(datafile_header)) & 0x0000ffff);
  111.   datafile_header = int2bin16(tmp1) + datafile_header;
  112.   rarfile->write(datafile_header);
  113.   while (1) {
  114.     string datatmp;
  115.     datatmp = datafile->read(1024*8);
  116.     if (datatmp == 0 || strlen(datatmp)==0) {
  117.       break;
  118.     }
  119.     rarfile->write(datatmp);
  120.   }
  121.   datafile->close();
  122.   return 1;
  123. }
  124.  
  125. int adddir_header(string filename1,Stdio.File rarfile) {
  126.   int tmp1;
  127.   string datafile_header="";
  128.   Stdio.Stat datafile_stat;
  129.   mapping(string:int) datafile_mtime;
  130.  
  131.   /* header: type, flags */
  132.   datafile_header = "\x74\0\xe0";
  133.   if (has_suffix(filename1, "\\") || has_suffix(filename1,"/")) {
  134.     filename1 = filename1[..strlen(filename1)-2];
  135.   }
  136.  
  137.   tmp1 = 32+strlen(filename1);
  138.   datafile_header += int2bin16(tmp1);
  139.   datafile_header += int2bin32(0);
  140.   datafile_header += int2bin32(0);
  141.   datafile_header += "\0";
  142.   datafile_header += int2bin32(0);
  143.   datafile_stat = file_stat(filename1);
  144.   datafile_mtime = localtime(datafile_stat->mtime);
  145.  
  146.   tmp1 = (datafile_mtime["year"]-80);
  147.   if (tmp1 < 0) tmp1=0;
  148.   tmp1 = tmp1 << 25;
  149.   tmp1 = tmp1 + ((datafile_mtime["mon"]+1)<<21);
  150.   tmp1 = tmp1 + ((datafile_mtime["mday"])<<16);
  151.   tmp1 = tmp1 + ((datafile_mtime["hour"])<<11);
  152.   tmp1 = tmp1 + ((datafile_mtime["min"])<<5);
  153.   tmp1 = tmp1 + ((datafile_mtime["sec"])>>1);
  154.   datafile_header += int2bin32(tmp1);
  155.   datafile_header += "\x14\x30";
  156.   tmp1 = strlen(filename1);
  157.   datafile_header += int2bin16(tmp1);
  158.   datafile_header += "\x10\0\0\0";
  159.   datafile_header +=replace(filename1,"/","\\");
  160.   tmp1 = ((Gz.crc32(datafile_header)) & 0x0000ffff);
  161.   datafile_header = int2bin16(tmp1) + datafile_header;
  162.   rarfile->write(datafile_header);
  163. }
  164.  
  165. mapping(string:int) adddir_dirs=([]);
  166. int adddir(string filename1,Stdio.File rarfile) {
  167.   Filesystem.Traversion ft;
  168.   string filename;
  169.   ft = Filesystem.Traversion(filename1);
  170.   foreach(ft; string dir; string file) {
  171.     if (adddir_dirs[dir] != 1) {
  172.       adddir_header(dir,rarfile);
  173.       adddir_dirs += ([dir:1]);
  174.     }
  175.     filename = dir+file;
  176.     if (is_file(filename)) {
  177.       addfile(filename,rarfile);
  178.     } else if (is_dir(filename)) {
  179.       adddir_header(filename,rarfile);
  180.     }
  181.   }
  182. }
  183.  
  184. int main(int argc,array(string) argv) {
  185.   int i,tmp1;
  186.   string filename1;
  187.   Stdio.File rarfile = Stdio.File();
  188.     
  189.   if ( argc < 2 ) {
  190.     write ( "Usage: " + argv[0] + " ARCHIVE [FILE...]\n" );
  191.     return 1;
  192.   }
  193.   if (rarfile->open(argv[1],"wtc")==0) {
  194.     write("Cannot open "+argv[1]+" file\n");
  195.     return 0;
  196.   }
  197.   rarfile->write("Rar!\x1a\x07\0"); /* Marker block */
  198.   rarfile->write("\xcf\x90\x73\0\0\x0d\0\0\0\0\0\0\0"); /* Archive header */
  199.   for (i=2 ; i<argc ; i++) {
  200.     filename1 = argv[i];
  201.     if (is_file(filename1)) {
  202.       addfile(filename1,rarfile);
  203.     } else if (is_dir(filename1)) {
  204.       adddir(filename1,rarfile);
  205.     }
  206.   }
  207.   rarfile->close();
  208.   return 0;
  209. }
  210.